/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.graficaluna.dao.pedido;

import com.graficaluna.dao.otros.MyBatisConnectionFactory;
import com.graficaluna.service.pedido.ServicioPedido;
//import dto.DetalleOrdenTrabajoDTO;
import dto.OrdenTrabajoDTO;
import dto.PedidoDTO;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;


public class OrdenTrabajoDAO {

    private SqlSessionFactory sqlSessionFactory;

    public OrdenTrabajoDAO() {
        this.sqlSessionFactory = MyBatisConnectionFactory.getSqlSessionFactory();
    }

    public Connection obtenerConnexion() {
        SqlSession session = sqlSessionFactory.openSession();
        return session.getConnection();
    }

    public List<OrdenTrabajoDTO> listarOrdenesTrabajo() {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            List<OrdenTrabajoDTO> list = session.selectList("ordenTrabajoSQL.listarOrdenesTrabajo");
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            session.close();
        }
    }

    public void priorizarOrdenes() {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            session.selectList("ordenTrabajoSQL.priorizarOrden");
            session.commit();
        } finally {
            session.close();
        }
    }

    public void actualizarOrdenMaquina(OrdenTrabajoDTO p) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            session.update("ordenTrabajoSQL.actualizarOrdenTrabajo", p);
            session.commit();
        } finally {
            session.close();
        }
    }
    
    public void actualizarAsignacionMaquina(OrdenTrabajoDTO p) {
        SqlSession session = sqlSessionFactory.openSession();
        try {
            session.update("ordenTrabajoSQL.actualizarAsignacionMaquina", p);
            session.commit();
        } finally {
            session.close();
        }
    }

    public void insertar(OrdenTrabajoDTO ord) throws Exception {
        SqlSession session = sqlSessionFactory.openSession(false);
        try {
            session.insert("ordenTrabajoSQL.insertarOrdenTrabajoCabe", ord);
            for (PedidoDTO ped : ord.getLstPedidos()) {
                ped.setNumOrdenTrabajo(ord.getCodigo());
                session.insert("ordenTrabajoSQL.insertarOrdenTrabajoDeta", ped);
            }
            session.commit();
        } catch (Exception ex) {
            session.rollback();
            throw new Exception(ex.getMessage());
        } finally {
            session.close();
        }
    }

    public OrdenTrabajoDTO obtenerOrdenTrabajo(OrdenTrabajoDTO ord) throws Exception {
        SqlSession session = sqlSessionFactory.openSession(false);
        try {
            ord = session.selectOne("ordenTrabajoSQL.obtenerOrdenTrabajo", ord);
            if (ord != null) {
                List<Long> listaOrdenPedidosDeta = session.selectList("ordenTrabajoSQL.obtenerOrdenTrabajoDeta", ord);
                PedidoDTO pedido;
                for (Long idPedido : listaOrdenPedidosDeta) {
                    pedido = new PedidoDTO();
                    pedido.setNumPedido(idPedido);
                    pedido = new ServicioPedido().obtenerPedido(pedido);
                    ord.getLstPedidos().add(pedido);
                }
            }
            return ord;
        } catch (Exception ex) {
            throw new Exception(ex.getMessage());
        } finally {
            session.close();
        }
    }
    
    public void eliminarOrdenTrabajo(OrdenTrabajoDTO orden) throws Exception{
        SqlSession session = sqlSessionFactory.openSession(false);
        try{
            session.delete("ordenTrabajoSQL.eliminarOrdenTrabajoCabe", orden);
            session.delete("ordenTrabajoSQL.eliminarOrdenTrabajoDeta", orden);
            session.commit();
        }catch(Exception ex){
            session.rollback();
            throw new Exception(ex.getMessage());
        } finally {
            session.close();
        }
    }
    
    public void cambiarCodigoOrdenTrabajo(OrdenTrabajoDTO orden) throws Exception{
        SqlSession session = sqlSessionFactory.openSession(false);
        try{
            session.update("ordenTrabajoSQL.cambiarCodigoOrdenTrabajoCabe", orden);
            session.update("ordenTrabajoSQL.cambiarCodigoOrdenTrabajoDeta", orden);
            session.commit();
        }catch(Exception ex){
            session.rollback();
            throw new Exception(ex.getMessage());
        } finally {
            session.close();
        }
    }
    
    public void anularOrdenTrabajo(OrdenTrabajoDTO orden) throws Exception{
        SqlSession session = sqlSessionFactory.openSession(false);
        try{
            session.update("ordenTrabajoSQL.anularOrdenTrabajo", orden);
            session.commit();
        }catch(Exception ex){
            session.rollback();
            throw new Exception(ex.getMessage());
        } finally {
            session.close();
        }
    }
}
